package mybox.engine;

import java.util.ArrayList;

public class PlatteOO implements Figur{
	
	
	public QVector[] ecke = new QVector[4];
	public QVector aktPos;
	File4Qcad file4qcad;
	public double laserBreite;
	public double materialDicke;
	public double zinkungsFaktor;
	
	public double laenge;
	public double breite;
	
	public RandLinieOO[] randlinie = new RandLinieOO[4];
	
	public ArrayList<RandLinieOO> innerLinie = new ArrayList<RandLinieOO>();
	
	public String[] type = new String[4];
	
	public QVector center;
	
	
	public PlatteOO(
			File4Qcad file4qcad, 
			QVector aktPos,
			String[] type,
			double laenge,
			double breite,			
			double materialDicke,
			double zinkungsFaktor,
			double laserBreite			
			) {
		
		this.file4qcad=file4qcad;
		this.aktPos=new QVector(aktPos);
		this.laserBreite=laserBreite;
		this.materialDicke=materialDicke;
		this.zinkungsFaktor=zinkungsFaktor;
		
		this.laenge=laenge;
		this.breite=breite;
		
		
		double maleReduzierung=RandLinie.calcZinkenHoehe(materialDicke);
		
		if (type[0].indexOf("M")>-1) breite-=maleReduzierung;
		if (type[1].indexOf("M")>-1) laenge-=maleReduzierung;
		if (type[2].indexOf("M")>-1) breite-=maleReduzierung;
		if (type[3].indexOf("M")>-1) laenge-=maleReduzierung;
		
		
		
		ecke[0] = new QVector(aktPos);
		ecke[1] = new QVector(ecke[0].x+laenge,ecke[0].y);
		ecke[2] = new QVector(ecke[0].x+laenge,ecke[0].y+breite);
		ecke[3] = new QVector(ecke[0].x,ecke[0].y+breite);
		
		center = new QVector((ecke[0].x+ecke[1].x)/2,(ecke[0].y+ecke[3].y)/2);
		
		double phi =0;		
		
		for (int randIdx=0;randIdx<type.length;randIdx++) {			
			
			this.type[randIdx]=type[randIdx];
			double rLaenge=0;
			if (randIdx%2==0) rLaenge=laenge;
			else			  rLaenge=breite;
			boolean isFemale;
			if (type[randIdx].equalsIgnoreCase("F")) isFemale=true;
			else								     isFemale=false;
			boolean isGlatt;
			if (type[randIdx].equalsIgnoreCase("G")) isGlatt=true;
			else								     isGlatt=false;
			boolean isRand=true;
			boolean hasRandVerkuerzt;
			if (type[randIdx].equalsIgnoreCase("MR")) hasRandVerkuerzt=true;
			else								      hasRandVerkuerzt=false;
			
			QVector startPunkt = new QVector(ecke[randIdx]);
			if (type[randIdx].indexOf("M")>-1) {
				startPunkt=
					startPunkt.vecAdd(QVector.rphi(RandLinie.calcZinkenHoehe(materialDicke), phi-java.lang.Math.PI/2));
				
			}
			
			
			randlinie[randIdx] = new RandLinieOO(
					file4qcad,startPunkt,
					phi,rLaenge,materialDicke,zinkungsFaktor, laserBreite,
					isGlatt,isRand,isFemale,hasRandVerkuerzt);
			phi =phi+java.lang.Math.PI/2;
		}
				
	}
	
	public void addLinie(boolean isFemale, boolean isHorizontal, double orthoDistance, boolean maleBackset) {
		
		boolean isGlatt=false;
		boolean isRand=false;		
		boolean hasRandVerkuerzt=false;
		double phi =0;
		if (isHorizontal) {
			QVector startPunkt = new QVector(ecke[0]);
			startPunkt = startPunkt.vecAdd(new QVector(0,orthoDistance));
			RandLinieOO innereRandLinie = 
				new RandLinieOO(
						file4qcad,startPunkt,
						phi,laenge,materialDicke,zinkungsFaktor, laserBreite,
						isGlatt,isRand,isFemale,hasRandVerkuerzt
					);
			innerLinie.add(innereRandLinie);
		} else {
			QVector startPunkt = new QVector(ecke[0]);
			startPunkt = startPunkt.vecAdd(new QVector(orthoDistance+RandLinie.calcZinkenHoehe(materialDicke)-laserBreite,0));
			if (maleBackset) startPunkt = startPunkt.vecAdd(new QVector(0,-materialDicke));
			phi = java.lang.Math.PI/2;
			RandLinieOO innereRandLinie = 
				new RandLinieOO(
						file4qcad,startPunkt,
						phi,breite,materialDicke,zinkungsFaktor, laserBreite,
						isGlatt,isRand,isFemale,hasRandVerkuerzt
					);
			innerLinie.add(innereRandLinie);			
		}
		
	}


	public void draw() {
		
		for (int randIdx=0;randIdx<type.length;randIdx++) {
			randlinie[randIdx].draw();
		}
		
		if (innerLinie != null)
			for (int irandIdx=0;irandIdx<innerLinie.size();irandIdx++) {
				innerLinie.get(irandIdx).draw();
			}
		
	}
	
	public void drawEcken() {
		for (int eckIdx=0;eckIdx<ecke.length;eckIdx++) {
			Circle circle = new Circle(file4qcad, ecke[eckIdx], 1);
			circle.draw();
		}
	}
	
	public void addEckSchrauben(int eckNo, double x, double y, double radius) {
		QVector schraubenCenter = ecke[eckNo].vecAdd(new QVector(x,y));
		Circle circle = new Circle(file4qcad, schraubenCenter, radius);
		circle.draw();
	}
	

}
